package com.qc31.monitorlib.chart

import android.content.Context
import android.graphics.Color
import androidx.annotation.ColorInt
import androidx.core.content.ContextCompat
import com.github.mikephil.charting.charts.BarChart
import com.github.mikephil.charting.charts.LineChart
import com.github.mikephil.charting.charts.PieChart
import com.github.mikephil.charting.components.Legend
import com.github.mikephil.charting.components.XAxis
import com.github.mikephil.charting.components.XAxis.XAxisPosition
import com.github.mikephil.charting.components.YAxis
import com.github.mikephil.charting.components.YAxis.AxisDependency
import com.github.mikephil.charting.data.*
import com.github.mikephil.charting.formatter.IndexAxisValueFormatter
import com.github.mikephil.charting.formatter.PercentFormatter
import com.github.mikephil.charting.formatter.ValueFormatter
import com.github.mikephil.charting.interfaces.datasets.IBarDataSet
import com.github.mikephil.charting.utils.ColorTemplate
import com.github.mikephil.charting.utils.MPPointF
import com.github.mikephil.charting.utils.Utils
import com.qc31.baselib.net.AppContext
import com.qc31.comlib.entity.OilDetail
import com.qc31.monitorlib.R
import java.text.DecimalFormat
import kotlin.math.max
import kotlin.math.min

/**
 * @desc:
 *
 * @author: pc-hfjs @create: 2019/3/29 10:10 @change_desc: @change_time:
 */
object MPChartUtils {

    /**
     * 配置Chart 基础设置
     *
     * @param mChart 图表
     * @param mLabels x 轴标签
     */
    fun configChart(mChart: LineChart, mLabels: List<String>?) {
        mChart.setDrawGridBackground(false)
        mChart.setDrawBorders(false)
        mChart.setScaleEnabled(false)
        mChart.isDragEnabled = true
        mChart.setNoDataText("")
        // 不显示描述数据
        mChart.description.isEnabled = false
        mChart.axisRight.isEnabled = false //禁用右侧y轴
        mChart.legend.isEnabled = false
        val xAxis = mChart.xAxis
        // 是否显示x轴线
        xAxis.setDrawAxisLine(true)
        // 设置x轴线的颜色
        xAxis.axisLineColor = Color.parseColor("#3791E9")
        // 是否绘制x方向网格线
        xAxis.setDrawGridLines(true)
        //x方向网格线的颜色
//        xAxis.setGridColor(Color.WHITE);
        // 设置x轴数据的位置
        xAxis.position = XAxis.XAxisPosition.BOTTOM
        // 设置x轴文字的大小
        xAxis.textSize = 10f
        if (mLabels != null) {
            // 显示x轴标签
            val formatter: ValueFormatter = object : ValueFormatter() {
                override fun getFormattedValue(value: Float): String {
                    val index = value.toInt()
                    return if (index < 0 || index >= mLabels.size) {
                        ""
                    } else mLabels[index]
                }
            }
            // 引用标签
            xAxis.valueFormatter = formatter
        }
        xAxis.yOffset = 5f
        // 设置x轴文字颜色
        xAxis.textColor = Color.parseColor("#3791E9")
        val yAxis = mChart.axisLeft
        // 设置y轴的最小值
        yAxis.axisMinimum = 0f
        // 是否显示y轴
        yAxis.setDrawAxisLine(true)
        yAxis.axisLineColor = Color.parseColor("#3791E9")
        // 设置y轴数据的位置
        yAxis.setPosition(YAxis.YAxisLabelPosition.OUTSIDE_CHART)
        // 不从y轴发出横向直线
        yAxis.setDrawGridLines(true)
        // 是否显示y轴坐标线
        yAxis.setDrawZeroLine(true)
        // 设置y轴的文字颜色
        yAxis.textColor = Color.parseColor("#3791E9")
        // 设置y轴文字的大小
        yAxis.textSize = 10f
        yAxis.valueFormatter = object : ValueFormatter() {
            override fun getFormattedValue(value: Float): String {
                return DecimalFormat("###,###,##0").format(value)
            }
        }

        // x轴执行动画
        mChart.animateXY(1000, 2000)
    }

    /**
     * 配置Chart 基础设置
     *
     * @param mChart 图表
     */
    fun configChart(mChart: LineChart, isDrawLine: Boolean = true) {
        mChart.setDrawGridBackground(false)
        mChart.setDrawBorders(false)
        mChart.setScaleEnabled(false)
        mChart.isDragEnabled = false
        mChart.setNoDataText("")
        mChart.extraBottomOffset = 10f //距视图窗口底部的偏移，类似与paddingbottom
        mChart.extraTopOffset = 10f //距视图窗口顶部的偏移，类似与paddingtop
        // 不显示描述数据
        mChart.description.isEnabled = false
        mChart.axisRight.isEnabled = false //禁用右侧y轴
        mChart.legend.isEnabled = false
        val xAxis = mChart.xAxis
        // 是否显示x轴线
        xAxis.setDrawAxisLine(true)
        // 设置x轴线的颜色
        xAxis.axisLineColor = Color.parseColor("#3791E9")
        // 是否绘制x方向网格线
        xAxis.setDrawGridLines(isDrawLine)
        //x方向网格线的颜色
//        xAxis.setGridColor(Color.WHITE);
        // 设置x轴数据的位置
        xAxis.position = XAxisPosition.BOTTOM
        // 设置x轴文字的大小
        xAxis.textSize = 10f
        xAxis.yOffset = 5f
        // 设置x轴文字颜色
        xAxis.textColor = Color.parseColor("#3791E9")
        val yAxis = mChart.axisLeft
        // 设置y轴的最小值
        yAxis.axisMinimum = 0f
        // 是否显示y轴
        yAxis.setDrawAxisLine(true)
        yAxis.axisLineColor = Color.parseColor("#3791E9")
        // 设置y轴数据的位置
        yAxis.setPosition(YAxis.YAxisLabelPosition.OUTSIDE_CHART)
        // 不从y轴发出横向直线
        yAxis.setDrawGridLines(isDrawLine)
        // 是否显示y轴坐标线
        yAxis.setDrawZeroLine(true)
        // 设置y轴的文字颜色
        yAxis.textColor = Color.parseColor("#3791E9")
        // 设置y轴文字的大小
        yAxis.textSize = 10f
        yAxis.valueFormatter = object : ValueFormatter() {
            override fun getFormattedValue(value: Float): String {
                return DecimalFormat("###,###,##0").format(value)
            }
        }

        // x轴执行动画
        mChart.animateX(500)
    }

    /**
     * 获取LineDataSet
     *
     * @param entries
     * @param label
     * @param textColor
     * @param lineColor
     * @return
     */
    fun getLineData(
        entries: List<Entry?>?,
        label: String?,
        @ColorInt textColor: Int,
        @ColorInt lineColor: Int,
        isFill: Boolean
    ): LineDataSet {
        val dataSet = LineDataSet(entries, label)
        // 设置曲线的颜色
        dataSet.color = lineColor
        //数值文字颜色
        dataSet.valueTextColor = textColor
        // 模式为贝塞尔曲线
        dataSet.mode = LineDataSet.Mode.HORIZONTAL_BEZIER
        // 是否绘制数据值
        dataSet.setDrawValues(true)
        // 是否绘制圆点
        dataSet.setDrawCircles(true)
        dataSet.setDrawCircleHole(false)

        //设置圆点的颜色
        dataSet.setCircleColor(lineColor)
        // 设置圆点半径
        dataSet.circleRadius = 3.5f
        // 设置线的宽度
        dataSet.lineWidth = 1f
        //是否设置填充曲线到x轴之间的区域
        dataSet.setDrawFilled(isFill)
        // set color of filled area
        if (Utils.getSDKInt() >= 18) {
            // drawables only supported on api level 18 and above
            val drawable =
                ContextCompat.getDrawable(AppContext.getAppContext(), R.drawable.chart_fade_349)
            dataSet.fillDrawable = drawable
        } else {
            dataSet.fillColor = Color.BLACK
        }
        return dataSet
    }

    /**
     * 获取LineDataSet
     *
     * @param entries
     * @param lineColor
     * @return
     */
    fun getLineData(entries: List<Entry?>?, @ColorInt lineColor: Int): LineDataSet {
        val dataSet = LineDataSet(entries, "")
        // 设置曲线的颜色
        dataSet.color = lineColor
        // 模式为贝塞尔曲线
        dataSet.mode = LineDataSet.Mode.HORIZONTAL_BEZIER
        // 是否绘制数据值
        dataSet.setDrawValues(false)
        // 是否绘制圆点
        dataSet.setDrawCircles(false)
        dataSet.setDrawCircleHole(false)

        // 设置线的宽度
        dataSet.lineWidth = 1f
        //是否设置填充曲线到x轴之间的区域
        dataSet.setDrawFilled(false)
        // set color of filled area
//        if (Utils.getSDKInt() >= 18) {
//            // drawables only supported on api level 18 and above
////            val drawable =
////                ContextCompat.getDrawable(BaseApp.application, R.drawable.chart_color_349)
//            dataSet.fillColor = Color.parseColor("#3791E9")
//        } else {
//            dataSet.fillColor = Color.BLUE
//        }
        return dataSet
    }


    var mFormat = DecimalFormat("###,###,##0.0")

    /**
     * 配置柱状图基础设置
     *
     * @param barChart
     * @param xLabels
     */
    fun configBarChart(barChart: BarChart, xLabels: Array<String>?) {
        barChart.description.isEnabled = false //设置描述
        barChart.setPinchZoom(false) //设置按比例放缩柱状图
        barChart.setScaleEnabled(false)
        barChart.isDragEnabled = true
        barChart.setNoDataText("") // 没有数据时的提示文案
        barChart.animateXY(1400, 1400)
        barChart.axisRight.isEnabled = false //禁用右侧y轴
        barChart.legend.isEnabled = false
        barChart.extraBottomOffset = 10f //距视图窗口底部的偏移，类似与paddingbottom
        barChart.extraTopOffset = 10f //距视图窗口顶部的偏移，类似与paddingtop

        val xAxis = barChart.xAxis //获取x轴
        xAxis.position = XAxis.XAxisPosition.BOTTOM //设置X轴标签显示位置
        xAxis.setDrawGridLines(false) //不绘制格网线
        xAxis.granularity = 1f //设置最小间隔，防止当放大时，出现重复标签。
        if (xLabels != null) {
            // 显示x轴标签
            val formatter: ValueFormatter = object : ValueFormatter() {
                override fun getFormattedValue(value: Float): String {
                    return xLabels[min(max(value.toInt(), 0), xLabels.size - 1)]
                }
            }
            xAxis.valueFormatter = formatter
            xAxis.labelCount = xLabels.size //设置标签显示的个数
        }

        xAxis.textSize = 10f //设置标签字体大小

        //y轴设置
        val leftAxis = barChart.axisLeft //获取左侧y轴
        leftAxis.setPosition(YAxis.YAxisLabelPosition.OUTSIDE_CHART) //设置y轴标签显示在外侧
        leftAxis.axisMinimum = 0f //设置Y轴最小值
        leftAxis.valueFormatter = object : ValueFormatter() {
            override fun getFormattedValue(value: Float): String {
                return DecimalFormat("###,###,##0").format(value)
            }
        }
    }

    /**
     * 配置柱状图基础设置
     *
     * @param barChart
     * @param xLabels
     */
    fun configBarChart(barChart: BarChart, xLabels: ArrayList<String>) {
        barChart.description.isEnabled = false //设置描述
        barChart.setPinchZoom(false) //设置按比例放缩柱状图
        barChart.setScaleEnabled(false)
        barChart.isDragEnabled = true
        barChart.setNoDataText("") // 没有数据时的提示文案
        barChart.animateXY(1400, 1400)
        barChart.axisRight.isEnabled = false //禁用右侧y轴
        barChart.legend.isEnabled = false
        barChart.extraBottomOffset = 10f //距视图窗口底部的偏移，类似与paddingbottom
        barChart.extraTopOffset = 10f //距视图窗口顶部的偏移，类似与paddingtop

        val xAxis = barChart.xAxis //获取x轴
        xAxis.position = XAxis.XAxisPosition.BOTTOM //设置X轴标签显示位置
        xAxis.setDrawGridLines(false) //不绘制格网线
        xAxis.granularity = 1f //设置最小间隔，防止当放大时，出现重复标签。

        // 显示x轴标签
        val formatter: ValueFormatter = object : ValueFormatter() {
            override fun getFormattedValue(value: Float): String {
                return xLabels[min(max(value.toInt(), 0), xLabels.size - 1)]
            }
        }
        xAxis.valueFormatter = formatter
        xAxis.labelCount = xLabels.size //设置标签显示的个数


        xAxis.textSize = 10f //设置标签字体大小

        //y轴设置
        val leftAxis = barChart.axisLeft //获取左侧y轴
        leftAxis.setPosition(YAxis.YAxisLabelPosition.OUTSIDE_CHART) //设置y轴标签显示在外侧
        leftAxis.axisMinimum = 0f //设置Y轴最小值
        leftAxis.valueFormatter = object : ValueFormatter() {
            override fun getFormattedValue(value: Float): String {
                return DecimalFormat("###,###,##0").format(value)
            }
        }
    }

    /**
     * 初始化柱状图图表数据
     *
     * @param chart
     * @param entries
     * @param title
     */
    fun initBarChart(
        chart: BarChart,
        entries: List<BarEntry>,
        title: String,
        colors: ArrayList<Int> = getColors(chart.context),
        barWidth: Float = 0.3f
    ) {
        val set1 = BarDataSet(entries, title)
        set1.colors = colors
        val dataSets = ArrayList<IBarDataSet>()
        dataSets.add(set1)
        val data = BarData(dataSets)
        data.setValueTextSize(10f)
        // 设置bar的宽度，但是点很多少的时候好像没作用，会拉得很宽
        data.barWidth = barWidth
        // 设置value值 颜色
        data.setValueTextColors(colors)
        //设置y轴显示的标签
        data.setValueFormatter(object : ValueFormatter() {
            override fun getFormattedValue(value: Float): String {
                return mFormat.format(value.toDouble())
            }
        })
        chart.data = data
        chart.invalidate()
    }

    private fun getColors(context: Context): ArrayList<Int> {
        //设置颜色
        val colors = ArrayList<Int>()
        colors.add(ContextCompat.getColor(context, R.color.color_F7E))
        colors.add(ContextCompat.getColor(context, R.color.color_FDB))
        colors.add(ContextCompat.getColor(context, R.color.color_F36))
        colors.add(ContextCompat.getColor(context, R.color.color_70A))
        colors.add(ContextCompat.getColor(context, R.color.color_8DB))
        colors.add(ContextCompat.getColor(context, R.color.color_D6B))
        colors.add(ContextCompat.getColor(context, R.color.color_6B6))
        colors.add(ContextCompat.getColor(context, R.color.color_8DA))
        colors.add(ContextCompat.getColor(context, R.color.color_A7D))
        colors.add(ContextCompat.getColor(context, R.color.color_C8E))
        colors.add(ContextCompat.getColor(context, R.color.color_798))
        colors.add(ContextCompat.getColor(context, R.color.color_AFD))
        colors.add(ContextCompat.getColor(context, R.color.color_C8B))
        colors.add(ContextCompat.getColor(context, R.color.color_E6C))
        colors.add(ContextCompat.getColor(context, R.color.color_FBB))
        colors.add(ContextCompat.getColor(context, R.color.color_A1C))
        colors.add(ContextCompat.getColor(context, R.color.color_A5B))
        colors.add(ContextCompat.getColor(context, R.color.color_8AC))
        colors.add(ContextCompat.getColor(context, R.color.color_F28))
        colors.add(ContextCompat.getColor(context, R.color.color_F95))
        return colors
    }

    private fun getOfflineColors(context: Context): ArrayList<Int> {
        //设置颜色
        val colors = ArrayList<Int>()
        colors.add(ContextCompat.getColor(context, R.color.color_4FB))
        colors.add(ContextCompat.getColor(context, R.color.color_ff5))
        colors.add(ContextCompat.getColor(context, R.color.color_379))
        return colors
    }

    fun initPieChart(pieChart: PieChart) {
        pieChart.setUsePercentValues(false) //设置图表内值显示为原始值或百分之
        pieChart.setHoleColor(Color.WHITE) //设置中心圈背景颜色
        pieChart.setDrawSlicesUnderHole(true) //设置在中心圈下面是否显示切片
        pieChart.isDrawHoleEnabled = true //设置是否显示中心圈部分
//        pieChart.centerText = centerTitle //设置中心圈文字
        pieChart.setDrawCenterText(false) //设置是否显示中心圈文字
        pieChart.holeRadius = 70f //设置中心圈半径占整个饼状图半径的百分比，默认50 %
        pieChart.setTransparentCircleColor(Color.GRAY) //设置透明圈的颜色
        pieChart.transparentCircleRadius = 76f //设置透明圈半径占整个饼状图半径的百分比，默认55 %
        pieChart.setTransparentCircleAlpha(100) //设置透明圈的透明度
        pieChart.maxAngle = 360f //设置饼图的最大角度，90 <= maxangle <= 360
        pieChart.animateXY(1400, 1400)
        //        pieChart.setEntryLabelTextSize(10f);//文字大小
        pieChart.description = null //是否右下角文字
        pieChart.setDrawEntryLabels(false) //是否显示类型的文字
        pieChart.setEntryLabelColor(Color.BLACK);//文字颜色
        pieChart.dragDecelerationFrictionCoef = 0.95f
        pieChart.setExtraOffsets(30f, 0f, 30f, 0f)
    }

    fun initPieChart(pieChart: PieChart, centerTitle: String = "") {
        pieChart.setUsePercentValues(true) //设置图表内值显示为原始值或百分之
        pieChart.setHoleColor(Color.WHITE) //设置中心圈背景颜色
        pieChart.setDrawSlicesUnderHole(true) //设置在中心圈下面是否显示切片
        pieChart.isDrawHoleEnabled = true //设置是否显示中心圈部分
        pieChart.centerText = centerTitle //设置中心圈文字
        pieChart.setDrawCenterText(true) //设置是否显示中心圈文字
        pieChart.holeRadius = 70f //设置中心圈半径占整个饼状图半径的百分比，默认50 %
        pieChart.setTransparentCircleColor(Color.GRAY) //设置透明圈的颜色
        pieChart.transparentCircleRadius = 55f //设置透明圈半径占整个饼状图半径的百分比，默认55 %
        pieChart.setTransparentCircleAlpha(100) //设置透明圈的透明度
        pieChart.maxAngle = 360f //设置饼图的最大角度，90 <= maxangle <= 360
        pieChart.animateXY(1400, 1400)
        //        pieChart.setEntryLabelTextSize(10f);//文字大小
        pieChart.description = null //是否右下角文字
        pieChart.setDrawEntryLabels(false) //是否显示类型的文字
//        pieChart.setEntryLabelColor(Color.BLACK);//文字颜色
//        pieChart.dragDecelerationFrictionCoef = 0.95f
        pieChart.setExtraOffsets(0f, 0f, 30f, 0f)
    }

    private fun setLegend(legend: Legend, isBottom: Boolean = true) {
        if (isBottom) {
            legend.verticalAlignment =
                Legend.LegendVerticalAlignment.BOTTOM //设置位置上下
            legend.horizontalAlignment =
                Legend.LegendHorizontalAlignment.CENTER //设置位置左右
            legend.orientation = Legend.LegendOrientation.HORIZONTAL
            legend.xEntrySpace = 20f
        } else {
            legend.verticalAlignment =
                Legend.LegendVerticalAlignment.TOP //设置位置上下
            legend.horizontalAlignment =
                Legend.LegendHorizontalAlignment.RIGHT //设置位置左右
            legend.orientation = Legend.LegendOrientation.VERTICAL
            legend.xEntrySpace = 5f
            legend.yEntrySpace = 0f
        }

        legend.isWordWrapEnabled = true
        legend.setDrawInside(false)

        legend.textSize = 10f
        legend.yOffset = 2f //距离底边的距离
    }

    private fun getPieDataSet(
        context: Context,
        entries: List<PieEntry>,
        isColor: Boolean = true,
        isBottom: Boolean = true
    ): PieDataSet {
        val dataSet = PieDataSet(entries, "  ")
        dataSet.setDrawIcons(false)
        dataSet.sliceSpace = 2f
        dataSet.iconsOffset = MPPointF(0f, 20f)
        dataSet.selectionShift = 5f
        dataSet.colors = if (isColor) getColors(context) else getOfflineColors(context)

        if (isBottom) {
            dataSet.valueLineColor = Color.parseColor("#a1a1a1")
            //      当值位置为外边线时，表示线的前半段长度。
            dataSet.valueLinePart1Length = 0.3f
            //      当值位置为外边线时，表示线的后半段长度。
            dataSet.valueLinePart2Length = 0.5f
            //        设置Y值的位置是在圆内还是圆外
            dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE
            dataSet.valueLinePart1OffsetPercentage = 80f
        }
        return dataSet
    }

    fun setPieData(pieChart: PieChart, entries: List<PieEntry>, isBottom: Boolean = true) {
        val data = PieData(getPieDataSet(pieChart.context, entries, isBottom))
        //        data.setValueFormatter(new PercentFormatter());
        if (!isBottom) data.setValueFormatter(PercentFormatter())
        data.setValueTextSize(10f) //百分比字体大小
        data.setValueTextColor(Color.BLACK) //设置百分比颜色
        setLegend(pieChart.legend, isBottom)
        pieChart.data = data
        pieChart.highlightValues(null)
        pieChart.invalidate()
    }

    fun setPieDataA(pieChart: PieChart, entries: List<PieEntry>) {
        val data = PieData(getPieDataSet(pieChart.context, entries, false, true))
        data.setValueFormatter(object : ValueFormatter() {
            override fun getFormattedValue(value: Float): String {
                return DecimalFormat("###,###,##0").format(value)
            }
        })
        data.setValueTextSize(10f) //百分比字体大小
        data.setValueTextColor(Color.BLACK) //设置百分比颜色
        setLegend(pieChart.legend, true)
        pieChart.data = data
        pieChart.highlightValues(null)
        pieChart.invalidate()
    }


    ///////////////////////////////////////////////////////////////////////////////////////////////////
    private var leftColor: String = ""
    private var kmColor: String = ""
    private var speedColor: String = ""
    private var vDataSet: LineDataSet? = null
    private var voDataSet: LineDataSet? = null
    private var kmDataSet: LineDataSet? = null
    private var speedDataSet: LineDataSet? = null

    fun initLineChart(
        chart: LineChart,
        leftColor: String,
        kmColor: String,
        speedColor: String,
        unit: String
    ) {
        //后台绘制
        chart.setDrawGridBackground(false)
        //设置描述文本
        chart.description.isEnabled = false
        //设置支持触控手势
        chart.setTouchEnabled(true)
        //设置缩放
        chart.isScaleYEnabled = false
        chart.isScaleXEnabled = true
        //设置推动
        chart.setScaleEnabled(true)
        //如果禁用,扩展可以在x轴和y轴分别完成
        chart.setPinchZoom(true)
        chart.dragDecelerationFrictionCoef = 0.9f
        chart.isHighlightPerDragEnabled = true
        chart.animateX(1500)
        //是否显示图例说明
        chart.legend.isEnabled = false
        MPChartUtils.leftColor = leftColor
        MPChartUtils.kmColor = kmColor
        MPChartUtils.speedColor = speedColor
        initYAxis(chart.axisLeft, MPChartUtils.leftColor, unit)

    }

    /** 初始化油量 */
    fun initYAxis(yAxis: YAxis, color: String, unit: String) {
        yAxis.axisMinimum = 0f
        // vertical grid lines
        yAxis.enableGridDashedLine(10f, 10f, 0f)
        yAxis.isGranularityEnabled = true
        yAxis.axisLineColor = ColorTemplate.rgb(color)
        yAxis.textColor = ColorTemplate.rgb(color)
        yAxis.valueFormatter = MAxisFormat(unit)
    }

    /** 初始化时间 */
    fun initXAxis(chart: LineChart, values: Collection<String>) {
        val xAxis = chart.xAxis
        xAxis.position = XAxisPosition.BOTTOM
        // vertical grid lines
        xAxis.enableGridDashedLine(10f, 10f, 0f)
        xAxis.granularity = 1f // only intervals of 1 day
        xAxis.labelCount = 7
        xAxis.valueFormatter = IndexAxisValueFormatter(values)
    }

    /** 获取设置 */
    private fun getLineDataSet(
        data: ArrayList<Entry>,
        dependency: AxisDependency,
        color: String
    ): LineDataSet {
        val lineDataSet = LineDataSet(data, "")
        lineDataSet.axisDependency = dependency
        lineDataSet.lineWidth = 2f
        lineDataSet.setDrawCircles(false)
        lineDataSet.color = ColorTemplate.rgb(color)
        return lineDataSet
    }

    /** 3 设置数据 */
    fun setLineDataSet(
        chart: LineChart,
        data: ArrayList<OilDetail.Detail>,
        vData: ArrayList<Entry>,
        voData: ArrayList<Entry>,
        kmData: ArrayList<Entry>,
        speedData: ArrayList<Entry>,
        sensor: String,
        unit: String
    ): MChartMarker {
        vDataSet = getLineDataSet(vData, AxisDependency.LEFT, leftColor)
        voDataSet = getLineDataSet(voData, AxisDependency.LEFT, leftColor)
        kmDataSet = getLineDataSet(kmData, AxisDependency.RIGHT, kmColor)
        speedDataSet = getLineDataSet(speedData, AxisDependency.RIGHT, speedColor)

        // create a custom MarkerView (extend MarkerView) and specify the layout
        // to use for it
        val mv = MChartMarker(chart.context, data, sensor, unit)
        mv.chartView = chart // For bounds control
        chart.marker = mv
        return mv
    }

    /** 改变数据 */
    fun changeLineData(chart: LineChart, isOpti: Boolean = false, isKm: Boolean = false) {
        val leftDataSet = if (isOpti) {
            voDataSet
        } else {
            vDataSet
        }
        val rightDataSet = if (isKm) {
            initYAxis(chart.axisRight, kmColor, "km")
            kmDataSet
        } else {
            initYAxis(chart.axisRight, speedColor, "km/h")
            speedDataSet
        }
        val data = LineData(leftDataSet, rightDataSet)
        data.setValueTextColor(Color.BLACK)
        data.setValueTextSize(9f)
        chart.data = data
        chart.invalidate()
    }

    fun clearData() {
        vDataSet?.clear()
        vDataSet = null
        voDataSet?.clear()
        voDataSet = null
        kmDataSet?.clear()
        kmDataSet = null
        speedDataSet?.clear()
        speedDataSet = null
    }

}